[DESCRIPTION]
UART Log是Targe端Linux kernel透过UART硬件以固定的波特率传输到PC端的一种log方式,这种方式由于在操作过程中的一些lock机制以及硬件传输的限制会在较大程度上影响系统的Performance,严重的时候可能达到20%的程度,甚至可能卡住系统导致重启。
UART Log在USER版本上是默认关闭的,ENG版本则默认打开。由于UART Log对Performance有影响,所以对于一些Performance的测试我们都会要求关闭UART log进行测试对比。在某一些问题上面,UART log对系统的影响也可能导致user版本和eng版本有不同的行为。
针对这种差异,我们从JB9.MP这个分支开始做了一个新的feature,ENG版本在开机到Launcher之后自动关闭UART Log,从而使几乎大部分的测试在eng版本和user版本上得到一致的测试结果。
抓UART Log的时候会看到类似下面的Log。
[ 25.986567].(1)[324:Binder_1][usktrk] socket close[10422]
[ 25.987748].(1)[324:Binder_1]BOOTPROF: 25987.740155:BOOT_Animation:END
[ 25.988616].(1)[324:Binder_1]<< printk console disable >>
[ 25.987748].(1)[324:Binder_1]BOOTPROF: 25987.740155:BOOT_Animation:END
[ 25.988616].(1)[324:Binder_1]<< printk console disable >>
那如何打开UART log呢?
[SOLUTION]
有两种种方法可以在eng版本上临时打开UART log(重启之后失效):
- 在超级终端窗口按下键盘的任何一个按键就可以让UART log继续吐。此种方式需要UART的TX和RX都要连接好。
- 通过修改proc参数的方式: adb shell echo 1 > /proc/mtprintk
还有一种方法可以在eng版本上面永久性打开UART Log (重启之后继续有效):
- 通过修改Property的方式:adb shell setprop persist.uartconsole.enable 1
终极办法:kernel/kernel/printk.c
inline void mt_disable_uart()
{
if(mt_need_uart_console == 0){
printk("<< printk console disable >>\n");
printk_disable_uart = 0;//1 //modified by xxx on 20140627 temp
}else{
printk("<< printk console can't be disabled >>\n");
}
}